//
// Created by martin on 2/17/22.
//

#ifndef MUDUO_EVENTLOOPTHREADPOOL_H
#define MUDUO_EVENTLOOPTHREADPOOL_H

#include "muduo/base/noncopyable.h"

#include <string>
#include <functional>
#include <vector>
#include <memory>

namespace muduo
{
namespace net
{

class EventLoop;
class EventLoopThread;

class EventLoopThreadPool : noncopyable
{
public:
    typedef std::function<void(EventLoop*)> ThreadInitCallback;

    EventLoopThreadPool(EventLoop* baseLoop, const std::string& nameArg);
    ~EventLoopThreadPool();

    /* 设置线程数量, 需要在start()之前调用 */
    void setThreadNum(int numThreads)
    { numThreads_ = numThreads; }

    /* 启动线程池, 设置线程函数初始回调 */
    void start(const ThreadInitCallback& cb = ThreadInitCallback());

    /*
     * valid after calling start()
     * round-robin(轮询)
     */
    EventLoop* getNextLoop();

    /*
     * With the same hash code, it will always return the same EventLoop.
     */
    EventLoop* getLoopForHash(size_t hashCode);

    /* 获取所有loops(EventLoop数组) */
    std::vector<EventLoop*> getAllLoops();

    /* 获取线程池启动状态 */
    bool started() const
    { return started_; }

    /* 获取线程池名称 */
    const std::string& name() const
    { return name_; }

private:

    EventLoop* baseLoop_; // 与Acceptor所属EventLoop相同
    std::string name_;    // 线程池名称, 通常由用户指定. 线程池中EventLoopThread名称依赖于线程池名称
    bool started_;   // 线程池是否启动标志
    int numThreads_; // 线程数
    int next_;       // 新连接到来，所选择的EventLoopThread下标
    std::vector<std::unique_ptr<EventLoopThread>> threads_; // IO线程列表
    std::vector<EventLoop*> loops_;  // EventLoop列表, 指向的是EventLoopThread线程函数创建的EventLoop对象
};

} // namespace net
} // namespace muduo

#endif //MUDUO_EVENTLOOPTHREADPOOL_H
